package fr.mistra.exercice.bibliotheque.dao;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import fr.mistra.exercice.bibliotheque.modeles.Bibliotheque;

public class BibliothequeDAOMock implements BibliothequeDAO {
	private class MockBiblio {
		public long id;
		public String nom;
		public int capacite;
	}
	
	private Hashtable<Long, MockBiblio> hash;

	public BibliothequeDAOMock() {
		hash = new Hashtable<Long, MockBiblio>();
		MockBiblio m = new MockBiblio();
		m.id = 0L;
		m.nom = "Bibliotheque Mock par defaut";
		m.capacite = 5;
		hash.put(new Long(0L), m);
	}
	
	@Override
	public Bibliotheque getBibliotheque(long idBibliotheque) throws DAOException, NoSuchIdException {
		Long cle = new Long(idBibliotheque);
		if (hash.containsKey(cle)) {
			MockBiblio m = hash.get(cle);
			return new Bibliotheque(m.id, m.nom, m.capacite);
		}
		throw new NoSuchIdException("BibliothequeDAOMock", idBibliotheque);
	}

	@Override
	public List<Bibliotheque> getBibliotheques() throws DAOException {
		List<Bibliotheque> liste = new ArrayList<Bibliotheque>();
		for (MockBiblio m : hash.values()) {
			liste.add(new Bibliotheque(m.id, m.nom, m.capacite));
		}
		return liste;
	}

	@Override
	public void supprimerBibliotheque(long idBibliotheque) throws DAOException {
		Long l = new Long(idBibliotheque);
		if (hash.containsKey(l)) {
			hash.remove(l);
		}
		else {
			throw new DAOException("ID inexistant !", null);			
		}
	}

	@Override
	public void ajouterBibliotheque(Bibliotheque bibliotheque) throws DAOException {
		if (bibliotheque == null) throw new DAOException("Ne peut ajouter une Bibliotheque null", null);
		bibliotheque.setId(hash.values().size());
		Long l = new Long(bibliotheque.getId());
		while (hash.containsKey(l)) {
			//La cle est deja prise, on tente la suivante:
			l = new Long(l.longValue() + 1);
		}
		
		MockBiblio m = new MockBiblio();
		m.id = bibliotheque.getId();
		m.nom = bibliotheque.getNom();
		m.capacite = bibliotheque.getCapacite();
		hash.put(l, m);
	}

	@Override
	public void ajouterLivreAuFonds(long idLivre, long idBibliotheque) throws DAOException, NoSuchIdException {
		LivreDAO ldao = DAOFactory.getLivreDAO();
		ldao.ajouterLivre(idLivre, idBibliotheque);
	}

	@Override
	public void retirerLivreDuFonds(long idLivre, long idBibliotheque) throws DAOException, NoSuchIdException {
		LivreDAO ldao = DAOFactory.getLivreDAO();
		ldao.supprimerLivre(idLivre, idBibliotheque);
	}
	

}
